const express = require('express');
const Docker = require('dockerode');
const path = require('path');
const app = express();
const docker = new Docker();

app.use(express.json());

// 处理镜像构建请求
app.post('/build', async (req, res) => {
    const { dockerfilePath, imageTag, buildArgs } = req.body;
    const buildArgsObj = buildArgs.split(',').filter(arg => arg).reduce((acc, arg) => {
        const [key, value] = arg.split('=');
        acc[key] = value;
        return acc;
    }, {});

    try {
        const stream = await docker.buildImage({
            context: path.dirname(dockerfilePath),  // 修改为目录路径
            src: ['Dockerfile']  // 确保 Dockerfile 的文件名在数组中
        }, {
            t: imageTag,
            buildargs: buildArgsObj
        });

        docker.modem.followProgress(stream, (err, output) => {
            if (err) {
                console.error('镜像构建失败:', err.message);  // 增加日志记录
                res.status(500).json({ error: err.message });
            } else {
                res.json({ message: '镜像构建成功', output });
            }
        });
    } catch (error) {
        console.error('处理镜像构建请求时发生错误:', error.message);  // 增加日志记录
        res.status(500).json({ error: error.message });
    }
});

// 处理容器运行请求
app.post('/run', async (req, res) => {
    const { imageToRun, containerCmd, envVars } = req.body;
    const env = envVars.split(',').filter(arg => arg).map(arg => {  // 修改为键值对数组
        const [key, value] = arg.split('=');
        return `${key}=${value}`;
    });

    try {
        const container = await docker.createContainer({
            Image: imageToRun,
            Cmd: containerCmd.split(' '),  // 确保命令是一个数组
            Env: env
        });

        await container.start();
        const logs = await container.logs({ stdout: true, stderr: true });
        res.json({ message: '容器运行成功', logs: logs.toString() });
    } catch (error) {
        console.error('处理容器运行请求时发生错误:', error.message);  // 增加日志记录
        res.status(500).json({ error: error.message });
    }
});

const port = 3000;

// 更新根路径路由以返回H5页面
app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'public', 'index.html'));
});

app.listen(port, () => {
    console.log(`服务器运行在端口 ${port}`);
});